home *** CD-ROM | disk | FTP | other *** search
/ BMUG Revelations / BMUG Revelations.toast / Programming / Programming Languages / UCB Logo 3.0 / CSLS / compile < prev    next >
Text File  |  1992-09-04  |  4KB  |  134 lines

  1. TO COMPILE :PROCS
  2. IF WORDP :PROCS [COMPILE1 :PROCS STOP]
  3. IF EMPTYP :PROCS [STOP]
  4. COMPILE1 FIRST :PROCS
  5. COMPILE BF :PROCS
  6. END
  7.  
  8. TO COMPILE.FILTER :TEMPLATE :LIST
  9. LOCAL [GENPROC GENINPUT]
  10. MAKE "GENPROC GENSYM
  11. MAKE "GENINPUT GENSYM
  12. DEFINE :GENPROC (LIST ~
  13.     (LIST :GENINPUT) ~
  14.     (SE [IF EMPTYP] DOTS :GENINPUT (LIST (LIST "OUTPUT DOTS :GENINPUT))) ~
  15.     (SE [IF (] COMPILE.TEMPLATE :GENINPUT :TEMPLATE [)] ~
  16.         (LIST (SE [OUTPUT COMBINE ( FIRST] DOTS :GENINPUT [)] ~
  17.               [(] :GENPROC "BF DOTS :GENINPUT [)] ))) ~
  18.     (SE "OUTPUT :GENPROC "BF DOTS :GENINPUT))
  19. OUTPUT FPUT :GENPROC :LIST
  20. END
  21.  
  22. TO COMPILE.FOREACH :TEMPLATE :LIST
  23. LOCAL [GENPROC GENINPUT]
  24. MAKE "GENPROC GENSYM
  25. MAKE "GENINPUT GENSYM
  26. DEFINE :GENPROC (LIST ~
  27.     (LIST :GENINPUT) ~
  28.     (SE [IF EMPTYP] DOTS :GENINPUT [[STOP]]) ~
  29.     (COMPILE.TEMPLATE :GENINPUT :TEMPLATE) ~
  30.     (SE :GENPROC "BF DOTS :GENINPUT))
  31. OUTPUT FPUT :GENPROC :LIST
  32. END
  33.  
  34. TO COMPILE.LINE :LINE
  35. IF EMPTYP :LINE [OUTPUT []]
  36. IF LISTP FIRST :LINE ~
  37.    [OUTPUT FPUT (COMPILE.LINE FIRST :LINE) (COMPILE.LINE BF :LINE)]
  38. IF MEMBERP FIRST :LINE [FOREACH MAP REDUCE FILTER] ~
  39.    [OUTPUT SE (COMPILE.SPECIAL TOCLOSE :LINE) ~
  40.               (COMPILE.LINE FROMCLOSE :LINE)]
  41. OUTPUT FPUT (FIRST :LINE) (COMPILE.LINE BF :LINE)
  42. END
  43.  
  44. TO COMPILE.MAP :TEMPLATE :LIST
  45. LOCAL [GENPROC GENINPUT]
  46. MAKE "GENPROC GENSYM
  47. MAKE "GENINPUT GENSYM
  48. DEFINE :GENPROC (LIST ~
  49.     (LIST :GENINPUT) ~
  50.     (SE [IF EMPTYP] DOTS :GENINPUT (LIST (LIST "OUTPUT DOTS :GENINPUT))) ~
  51.     (SE [OUTPUT COMBINE (] COMPILE.TEMPLATE :GENINPUT :TEMPLATE [)] ~
  52.         [(] :GENPROC "BF DOTS :GENINPUT [)] ))
  53. OUTPUT FPUT :GENPROC :LIST
  54. END
  55.  
  56. TO COMPILE.REDUCE :FUNCTION :LIST
  57. LOCAL [GENPROC GENINPUT]
  58. MAKE "GENPROC GENSYM
  59. MAKE "GENINPUT GENSYM
  60. DEFINE :GENPROC (LIST ~
  61.     (LIST :GENINPUT) ~
  62.     (SE [IF EMPTYP BF] DOTS :GENINPUT ~
  63.         (LIST (SE [OUTPUT FIRST] DOTS :GENINPUT))) ~
  64.     (SE "OUTPUT :FUNCTION [( FIRST] DOTS :GENINPUT [)] ~
  65.         [(] :GENPROC "BF DOTS :GENINPUT [)] ))
  66. OUTPUT FPUT :GENPROC :LIST
  67. END
  68.  
  69. TO COMPILE.SPECIAL :EXPR
  70. IF EQUALP FIRST :EXPR "FOREACH ~
  71.    [OUTPUT COMPILE.FOREACH (LAST :EXPR) (COMPILE.LINE BL BF :EXPR)]
  72. OUTPUT RUN FPUT (WORD "COMPILE. FIRST :EXPR) ~
  73.                 (LIST FIRST BF :EXPR COMPILE.LINE BF BF :EXPR)
  74. END
  75.  
  76. TO COMPILE.TEMPLATE :INPUT :TEMPLATE
  77. IF EMPTYP :TEMPLATE [OUTPUT []]
  78. IF LISTP FIRST :TEMPLATE ~
  79.    [OUTPUT FPUT (COMPILE.TEMPLATE :INPUT FIRST :TEMPLATE) ~
  80.                 (COMPILE.TEMPLATE :INPUT BF :TEMPLATE)]
  81. IF EQUALP FIRST :TEMPLATE "? ~
  82.    [OUTPUT (SE [( FIRST] DOTS :INPUT [)] ~
  83.                (COMPILE.TEMPLATE :INPUT BF :TEMPLATE))]
  84. OUTPUT FPUT (FIRST :TEMPLATE) (COMPILE.TEMPLATE :INPUT BF :TEMPLATE)
  85. END
  86.  
  87. TO COMPILE.TEXT :LINES
  88. IF EMPTYP :LINES [OUTPUT []]
  89. OUTPUT FPUT (COMPILE.LINE FIRST :LINES) (COMPILE.TEXT BF :LINES)
  90. END
  91.  
  92. TO COMPILE1 :PROC
  93. LOCAL "TEXT
  94. IF PROCEDUREP WORD :PROC ".PRECOMPILE [STOP]
  95. MAKE "TEXT TEXT :PROC
  96. DEFINE (WORD :PROC ".PRECOMPILE) :TEXT
  97. DEFINE :PROC FPUT FIRST :TEXT COMPILE.TEXT BF :TEXT
  98. END
  99.  
  100. TO DOTS :NAME
  101. OUTPUT WORD ": :NAME
  102. END
  103.  
  104. TO FROMCLOSE :LIST
  105. OUTPUT FROMCLOSE1 :LIST 0
  106. END
  107.  
  108. TO FROMCLOSE1 :LIST :LEVEL
  109. IF EMPTYP :LIST [OUTPUT []]
  110. IF EQUALP FIRST :LIST "\) ~
  111.    [IFELSE EQUALP :LEVEL 0 ~
  112.            [OUTPUT :LIST] [OUTPUT FROMCLOSE1 BF :LIST :LEVEL-1]]
  113. IF EQUALP FIRST :LIST "\( [OUTPUT FROMCLOSE1 BF :LIST :LEVEL+1]
  114. OUTPUT FROMCLOSE1 BF :LIST :LEVEL
  115. END
  116.  
  117. TO TOCLOSE :LIST
  118. OUTPUT TOCLOSE1 :LIST 0
  119. END
  120.  
  121. TO TOCLOSE1 :LIST :LEVEL
  122. IF EMPTYP :LIST [OUTPUT []]
  123. IF EQUALP FIRST :LIST "\) ~
  124.    [IFELSE EQUALP :LEVEL 0 ~
  125.            [OUTPUT []] [OUTPUT TOCLOSE2 :LIST :LEVEL-1]]
  126. IF EQUALP FIRST :LIST "\( [OUTPUT TOCLOSE2 :LIST :LEVEL+1]
  127. OUTPUT TOCLOSE2 :LIST :LEVEL
  128. END
  129.  
  130. TO TOCLOSE2 :LIST :LEVEL
  131. OUTPUT FPUT FIRST :LIST TOCLOSE1 BF :LIST :LEVEL
  132. END
  133.  
  134.